package com.hliushi.proxy.example01;

import java.util.Arrays;
import java.util.List;

/**
 * 路由器
 *
 * @author: hliushi
 * @date: 2023/2/14 21:38
 **/
public class RouterProxy implements Internet {

    /**
     * 被代理对象
     */
    private Modem modem;

    private List<String> blackList = Arrays.asList("电影", "游戏", "音乐", "小说");


    /**
     * <code>核心区别: 就是对象的掌控权, 装饰是交给了客户端, 而代理是交给代理端</code>
     * <br/>
     * Tips: 路由器构造方法中实现对「猫」的全面管控，主动实例化了「猫」对象，而非外部注入
     * 从某种意义上将，这是代理模式区别与装饰器模式的一种体现。
     * <br/>
     * 虽然二者的理念与实现有些类似，但装饰器往往更加关注为其他对象增加功能，让客户端更加灵活地进行组件搭配
     * <br/>
     * 而代理模式更强调的则是一种对访问的管控，甚至是将代理对象完全封装而隐藏起来，使其对客户端完全透明
     */
    public RouterProxy() {
        try {
            // 实例化被代理类
            this.modem = new Modem("123456");
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }

    @Override
    public void httpAccess(String url) {
        // 遍历黑名单, 查看 url 是否包含黑名单的字眼
        for (String keyword : blackList) {
            if (url.contains(keyword)) {
                System.out.printf("禁止访问: %s\n", url);
                return;
            }
        }

        // 转发请求至"猫"以访问互联网
        modem.httpAccess(url);
    }
}
